package cn.aezo.minions.gen.render;

import cn.aezo.minions.gen.Context;
import cn.aezo.minions.gen.model.TemplateItem;
import cn.aezo.minions.utils.FtlU;
import cn.aezo.minions.utils.SmUtils;
import cn.aezo.utils.base.ValidU;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @author smalle
 * @date 2019-08-07 13:05
 */
@Slf4j
public class FtlRender implements Render {
    public static final String NotRender = "_NotRender_#";

    public void render(Context context, Map<String, Object> dataContext) {
        String renderDir = (String) dataContext.get("renderDir");
        List<TemplateItem> templateItems = (List<TemplateItem>) dataContext.get("templateItems");
        if(ValidU.isNotEmpty(templateItems) && ValidU.isNotEmpty(renderDir)) {
            File dirFile = new File(renderDir);
            if(dirFile.exists()) {
                SmUtils.deleteDir(dirFile);
            }

            for (TemplateItem templateItem : templateItems) {
                Integer type = templateItem.getItemType();
                try {
                    String fileName = FtlU.rendToString(templateItem.getItemName(), context.getContextMap());
                    if(ValidU.isNotEmpty(fileName)) {
                        String filePath = renderDir + "/" + fileName;
                        if(type == 1) {
                            // 属于文件夹
                            SmUtils.mkdir(filePath);
                            dataContext.put("templateItems", templateItem.getChildren());
                            dataContext.put("renderDir", filePath);
                            render(context, dataContext);
                        } else {
                            if(fileName.startsWith(NotRender)) {
                                // 不进行渲染
                                fileName = fileName.replaceFirst(NotRender, "");
                                SmUtils.write(renderDir + "/" + fileName, templateItem.getItemValue(), false);
                            } else {
                                String content = FtlU.rendToString(templateItem.getItemValue(), context.getContextMap());
                                SmUtils.write(filePath, content, false);
                            }
                        }
                    }
                } catch (IOException | TemplateException e) {
                    log.error(templateItem.getItemName() + " 渲染出错：" + e.getMessage());
                }
            }
        }
    }
}
